lors de ce projet nous aurons recours à la méthode CRISP “Cross-Industry Standard Process for Data Mining” vu que c’est la methode la plus utilisée pour orienter nos travaux d’éxploration de données .
Le tourisme tunisien a du mal à se relever de la révolution et de ses suites. Les chiffres 2013 le montrent: le nombre de nuitées touristiques a baissé entre 2010 et 2013 de plus de 15% (de 35,5 millions de nuitées à 30 millions) . en 2015 la Tunisie est devenue une no-go-zone pour les touristes étrangers suite aux attentats mais Les revenues du tourisme tunisien ont connu une amélioration de 42% estimées à 554 Millions de dollars dans les sept premiers mois de l’année 2018 le secteur est alors en train de guérir .
Cependant la compagnie tunisienne vise à modériniser sa flotte afin d’assurer les conditions les plus favorables aux visiteurs de notre pays .
Notre objectif metier consiste donc à :Dans le but de pouvoir atteindre nos objéctifs nous aurons recours aux ressources contenant les données et les informations nécessaires liées aux avions du monde , Royal Maroc Air et Tunisair
library(ggplot2)
library(dplyr)
library(gridExtra)
library(grid)
library(lattice)
library(ggpubr)
library(DataExplorer)
library(cluster)
library(factoextra)
library(tidyr)
library(FactoMineR)
library(tidyverse)
library(corrplot)
library(gridExtra)
library(GGally)
library(factoextra)
airline <- read.csv("airline.csv")
nous avons besoin des noms des compagnies seulement,cabin flown seat comfort rating entretanment value money staff rating ground service rating recommended overall_rating wifi rating .
quanti<-airline[,c(1,10,12,13,14,15,16,17,18,19,20)]
Voir s’il y a des données manquantes.
plot_missing(quanti)
quanti<-airline[,c(1,10,12,13,14,15,16,19,20)]
summary(quanti)
## airline_name cabin_flown overall_rating
## spirit-airlines : 990 : 2876 Min. : 1.00
## british-airways : 901 Business Class : 6347 1st Qu.: 3.00
## united-airlines : 840 Economy :29784 Median : 7.00
## jet-airways : 727 First Class : 879 Mean : 6.04
## air-canada-rouge: 715 Premium Economy: 1510 3rd Qu.: 9.00
## emirates : 691 Max. :10.00
## (Other) :36532 NA's :4535
## seat_comfort_rating cabin_staff_rating food_beverages_rating
## Min. :0.000 Min. :0.000 Min. :0.000
## 1st Qu.:2.000 1st Qu.:2.000 1st Qu.:1.000
## Median :3.000 Median :4.000 Median :3.000
## Mean :3.095 Mean :3.319 Mean :2.806
## 3rd Qu.:4.000 3rd Qu.:5.000 3rd Qu.:4.000
## Max. :5.000 Max. :5.000 Max. :5.000
## NA's :7690 NA's :7688 NA's :8132
## inflight_entertainment_rating value_money_rating recommended
## Min. :0.000 Min. :0.000 Min. :0.0000
## 1st Qu.:1.000 1st Qu.:2.000 1st Qu.:0.0000
## Median :2.000 Median :4.000 Median :1.0000
## Mean :2.392 Mean :3.164 Mean :0.5338
## 3rd Qu.:4.000 3rd Qu.:4.000 3rd Qu.:1.0000
## Max. :5.000 Max. :5.000 Max. :1.0000
## NA's :10282 NA's :1673
names(airline)
## [1] "airline_name" "link"
## [3] "title" "author"
## [5] "author_country" "date"
## [7] "content" "aircraft"
## [9] "type_traveller" "cabin_flown"
## [11] "route" "overall_rating"
## [13] "seat_comfort_rating" "cabin_staff_rating"
## [15] "food_beverages_rating" "inflight_entertainment_rating"
## [17] "ground_service_rating" "wifi_connectivity_rating"
## [19] "value_money_rating" "recommended"
Dans ce fichier on a utilisé les notes (reviews) de chaque service (food, staff, seat review, wifi….) dans toutes les compagnies aériennes
airline_sample <- na.omit(quanti)
airline_without_text<-airline_sample[,c(3,4,5,6,7,8)]
airline_sample<-airline_sample[,c(1,2,3,4,5,6,7,8)]
Aprés la préparation des données on passe à la classification des services offerts par Tunisair par rapport aux autres compagnies.
Pour étudier graphiquement quelle valeur de k nous donne la meilleure partition, nous pouvons tracer entre banseens et tot.withinss vs choix de k.
for(i in 1:10){
# Pour chaque k, calcule entre etbetweenss et tot.withinss
bss[i] <- kmeans(airline_without_text, centers=i)$betweenss
wss[i] <- kmeans(airline_without_text, centers=i)$tot.withinss
}
grid.arrange(p3, p4, ncol=2)
k <-list()
for(i in 1:10){
k[[i]] <- kmeans(airline_without_text,i)
}
betweennss_totss <- list()
for(i in 1:10){
betweennss_totss[[i]] <- k[[i]]$betweenss/k[[i]]$totss
}
#type = b to say that we want it to
#be both dots and lines
plot(1:10,betweennss_totss,type="b",
ylab="Between SS / Total SS",
xlab = "Cluster(k)")
On remarque que la meilleure ségmentation est avec 3 clusters :
set.seed(0)
air_k2 <- kmeans(airline_without_text, centers=3)
plot(airline_sample,col = air_k2$cluster)
air_k2$centers
## overall_rating seat_comfort_rating cabin_staff_rating
## 1 9.036940 4.305773 4.673919
## 2 2.066653 1.972632 2.004141
## 3 6.941714 3.388244 3.801556
## food_beverages_rating inflight_entertainment_rating value_money_rating
## 1 4.289334 3.983947 4.582052
## 2 1.734700 1.636134 1.802464
## 3 2.829341 1.729192 3.782662
Apres le clustering on a obtenu 3 groupes (bon , moyen, mauvais). Selectionnons les (notes) reviews de tunisair pour trouver son emplacement par rapport aux autres compagnies.
tunisair_riview = airline[which(airline$airline_name=="tunisair"),]
summary(tunisair_riview[,c(12,13,14,15,16,19,20)])
## overall_rating seat_comfort_rating cabin_staff_rating
## Min. : 1.0 Min. :1.000 Min. :1.000
## 1st Qu.: 4.0 1st Qu.:3.000 1st Qu.:1.000
## Median : 6.0 Median :3.500 Median :3.500
## Mean : 5.8 Mean :3.273 Mean :2.909
## 3rd Qu.: 8.0 3rd Qu.:4.000 3rd Qu.:4.000
## Max. :10.0 Max. :5.000 Max. :5.000
## NA's :14 NA's :27 NA's :27
## food_beverages_rating inflight_entertainment_rating value_money_rating
## Min. :1.0 Min. :0 Min. :0.000
## 1st Qu.:1.0 1st Qu.:0 1st Qu.:2.000
## Median :3.0 Median :1 Median :4.000
## Mean :2.5 Mean :1 Mean :3.061
## 3rd Qu.:3.0 3rd Qu.:1 3rd Qu.:4.000
## Max. :5.0 Max. :3 Max. :5.000
## NA's :27 NA's :27 NA's :16
## recommended
## Min. :0.0000
## 1st Qu.:0.0000
## Median :0.0000
## Mean :0.3469
## 3rd Qu.:1.0000
## Max. :1.0000
##
Commençons par l’importation du fichier delta.csv
## [1] FALSE
Visiblement notre fichier delta.csv ne contient aucune valeur manquantes passant ensuite a l’analyse de notre fichier : commencant par la boxplot :
boxplot(deltaFlotte)
nous remarquons que les valeurs n’ont pas la même unité alors nous allons passer au scaling :
deltaFlotteScale<-scale(deltaFlotte,scale = T,center = T)
boxplot(deltaFlotteScale)
Maintenant les données sont centrées ! passons ensuite à l’étape suivante qui consiste à déterminer le nombre de cluster que nous pouvons avoir
wss <- (nrow(deltaFlotteScale)-1)*sum(apply(deltaFlotteScale,2,var))
for (i in 2:15) wss[i] <- sum(kmeans(deltaFlotteScale,
centers=i)$withinss)
plot(1:15, wss, type="b", xlab="Number of Clusters",
ylab="Within groups sum of squares")
d’aprés le schéma nous pourrons diviser notre base sur 4 groupes, appliquons le kmeans :
set.seed(125)
km = kmeans(deltaFlotteScale,4)
gpe.kmeans = km$cluster
gpe.kmeans
## Airbus A319 Airbus A319 VIP
## 3 4
## Airbus A320 Airbus A320 32-R
## 3 3
## Airbus A330-200 Airbus A330-200 (3L2)
## 2 2
## Airbus A330-200 (3L3) Airbus A330-300
## 2 2
## Boeing 717 Boeing 737-700 (73W)
## 3 3
## Boeing 737-800 (738) Boeing 737-800 (73H)
## 3 3
## Boeing 737-900ER (739) Boeing 747-400 (74S)
## 3 2
## Boeing 757-200 (75A) Boeing 757-200 (75E)
## 3 2
## Boeing 757-200 (75M) Boeing 757-200 (75N)
## 3 3
## Boeing 757-200 (757) Boeing 757-200 (75V)
## 3 3
## Boeing 757-200 (75X) Boeing 757-300
## 2 3
## Boeing 767-300 (76G) Boeing 767-300 (76L)
## 2 2
## Boeing 767-300 (76P) Boeing 767-300 (76Q)
## 3 3
## Boeing 767-300 (76T) Boeing 767-300 (76U)
## 2 3
## Boeing 767-300 (76Z V.1) Boeing 767-300 (76Z V.2)
## 2 2
## Boeing 767-400 (76D) Boeing 777-200ER
## 2 2
## Boeing 777-200LR CRJ 100/200 Pinnacle/SkyWest
## 2 1
## CRJ 100/200 ExpressJet CRJ 700
## 1 3
## CRJ 900 E120
## 3 1
## E170 E175
## 3 3
## ERJ-145 MD-88
## 1 3
## MD-90 MD-DC9-50
## 3 3
Ici nous remarquons qu’il existe un cluster contenant un seul avion VIP de la classe club Airbus A319 VIP nous allons maintenant ajouter les clusters afin de pouvoir visualiser la répartition des avions :
library(FactoMineR)
#ajouter la colonne contenant le numero ducluster.
delta_withcluster=cbind(deltaFlotteScale,gpe.kmeans)
PCA_delta=PCA(delta_withcluster,quali.sup=34,quanti.sup = c(1,2,4,5,7,8,10,11,13,14,29,30,31,23,33))
Nous visualisons la répartition des avions entre les clusters
PCA_delta=PCA(delta_withcluster,quali.sup=34,quanti.sup = c(1,2,4,5,7,8,10,11,13,14,29,30,31,23,33))
res.pca <- PCA(delta_withcluster, graph = FALSE)
fviz_pca_var(res.pca, col.var = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE
)
#11
#plot(PCA_delta,habillage=34,col.hab=c("black","green","red","orange"))
datacluster=as.data.frame(delta_withcluster)
cluster1= datacluster[which(datacluster$gpe.kmeans==1),]
cluster2= datacluster[which(datacluster$gpe.kmeans==2),]
cluster3= datacluster[which(datacluster$gpe.kmeans==3),]
cluster4= datacluster[which(datacluster$gpe.kmeans==4),]
fusion<-as.data.frame(cbind(delta,groupe=datacluster$gpe.kmeans))
aff<-as.data.frame(fusion)
aggregate(aff,by=list(aff$groupe),FUN=mean)
h<-cluster1[,c(1,10,12,13,14,15,16,17,18,19,20)]
corrplot(cor(h), type="upper", method="ellipse", tl.cex=0.9)
PcaCl1=PCA(cluster1,quali.sup=29,quanti.sup = c(1,2,4,5,7,8,10,11,26,27,20))
res.pca <- PCA(h, graph = FALSE)
fviz_pca_var(res.pca, col.var = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE
)
cluster1_sof <- fusion[which(fusion$groupe==1),]
aggregate(cluster1_sof,by=list(cluster1_sof$groupe),FUN=mean)
h<-cluster2[,c(1,10,12,13,14,15,16,17,18,19,20)]
corrplot(cor(h), type="upper", method="ellipse", tl.cex=0.9)
PcaCl2=PCA(cluster2,quali.sup=29,quanti.sup = c(1,2,4,5,7,8,10,11,26,27,20))
res.pca <- PCA(h, graph = FALSE)
fviz_pca_var(res.pca, col.var = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE
)
cluster2_sof <- fusion[which(fusion$groupe==2),]
aggregate(cluster2_sof,by=list(cluster2_sof$groupe),FUN=mean)
CLUSTER 2 - un bon cluster en Sleeper ,Satellite , Power , Video ,Length..ft , tail.Height wingspan, nombre de moteur varie entre 2 et 3 ,range, Cruising speed, accomodation , seats Economy , Eco comfort , seat business ,seat pitch business, - Moyenne en Wifi - absence de first class.
h<-cluster3[,c(1,10,12,13,14,15,16,17,18,19,20)]
corrplot(cor(h), type="upper", method="ellipse", tl.cex=0.9)
PcaCl3=PCA(cluster3,quali.sup=29,quanti.sup = c(1,2,4,5,7,8,10,11,26,27,20))
res.pca <- PCA(h, graph = FALSE)
fviz_pca_var(res.pca, col.var = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE
)
cluster3_sof <- fusion[which(fusion$groupe==3),]
aggregate(cluster3_sof,by=list(cluster3_sof$groupe),FUN=mean)
axe 1 : seatpitch econmy , range miles ,seat first class and length ont une forte corrélation sur axe 1 axe2: firstclass,seatwidth and satelite on une forte corrélation avec l’axe 2
Le cluster 3 - la majorité des avions de ce cluster posséde first class et est faible en business class et en range.miles bon en sleeper - moyen en accomodation .
Le cluster 4 contient un seul avion, Vu qu’il contient la classe club .
table(km$cluster)
##
## 1 2 3 4
## 4 15 24 1
Possédant le plus de nombre d’observation et plutôt bon de point de vue qualité mais faible en range.miles on ne peut pas considérer le 3eme cluster comme le cluster le plus typique car ces avions ne sont pas conçus pour les longues distances .
nous pouvons considérer le cluster 2 comme le profile typique car il est plutôt bon de point de vue qualité et c’est le deuxieme cluster possédant le nombre d’observation apres le cluster 3 .
head(sort(cluster2$Range..miles.,decreasing = T))
## [1] 2.849619 2.046787 1.531276 1.213734 1.168184 1.168184
Cluster 1 : Ce cluster posséde le nombre d’avions le plus petit avec une qualité médiocre comme E120 et ERJ-145 Tunisair doit eviter ce cluster
Cluster 2: Ce cluster posséde des avions de bonnes qualité , ne possede pas de first class mais la classe economique et la classe buissness sont excellentes.
cluster 3 : ce cluster posséde 3 classes (first class, economy, business), et posséde le plus grand nombre d’avions.
cluster4 : Ce cluster contient un seul avion (A319 VIP).
profil typique
CLUSTER2 représente alors le profil typique des avions dans le monde car d’une part il est le meilleur de point de vue qualité ainsi qu’il contient le plus grand nombre d’individus (modèles d’avion).
Chargement du jeu des données de Tunisair
dataTunisair = read.table('tunisair.csv',sep=";",dec=",",header=T, row.names = 1)
head(dataTunisair)
dim(dataTunisair)
## [1] 28 33
Nous remarquons que la Tunisair dispose de 28 avions. Nous disposons de 28 entrées et 34 variables qui décrivent la dataset.
colnames(dataTunisair)
## [1] "Seat.Width..Club." "Seat.Pitch..Club."
## [3] "Seat..Club." "Seat.Width..First.Class."
## [5] "Seat.Pitch..First.Class." "Seats..First.Class."
## [7] "Seat.Width..Business." "Seat.Pitch..Business."
## [9] "Seats..Business." "Seat.Width..Eco.Comfort."
## [11] "Seat.Pitch..Eco.Comfort." "Seats..Eco.Comfort."
## [13] "Seat.Width..Economy." "Seat.Pitch..Economy."
## [15] "Seats..Economy." "Accommodation"
## [17] "Cruising.Speed..mph." "Range..miles."
## [19] "Engines" "Wingspan..ft."
## [21] "Tail.Height..ft." "Length..ft."
## [23] "Wifi" "Video"
## [25] "Power" "Satellite"
## [27] "Flat.bed" "Sleeper"
## [29] "Club" "First.Class"
## [31] "Business" "Eco.Comfort"
## [33] "Economy"
Ce dataset nous permet d’etudier “Aircraft” en se basant sur ces critéres ci dessus
any(is.na(dataTunisair)==1)
## [1] FALSE
Nous n’avons aucune valeur manquante
club=dataTunisair[which(dataTunisair$Club.>0),]
nrow(club)
## [1] 0
firstClasse=dataTunisair[which(dataTunisair$First.Class.>0),]
nrow(firstClasse)
## [1] 0
sleeper=dataTunisair[which(dataTunisair$Sleeper>0),]
nrow(sleeper)
## [1] 0
flatbed=dataTunisair[which(dataTunisair$Flat.bed>0),]
nrow(flatbed)
## [1] 2
nrow(flatbed)/length(dataTunisair)*100
## [1] 6.060606
Nous remarquons d’aprés la dataset que Tunisair n’a aucun avion qui comporte la classe club ni la classe premium qui sont les classes les plus modérnes et les meilleures au niveau confort.
Nous remarquons aussi qui’il n ya aucun avion avec la classe sleeper et seulement 2/28 (qui représentent seulenemnt 6%) avions disposant du flatBed(lit plat) et ce n’est pas trés important puisque Tunisair ne propose pas assez de vols à long-courriers.
#nombre d'avion qui comporte la classe economique
eco=dataTunisair[which(dataTunisair$Economy>0),]
nrow(eco)
## [1] 28
#nombre d'avion qui possede la classe bunisness
business=dataTunisair[which(dataTunisair$Business>0),]
nrow(business)
## [1] 19
nrow(business)/length(dataTunisair)*100
## [1] 57.57576
Nous remarquons que tout les avions de tunisair comportent la classe economique 28/28, et nous trouvons que 19/28 (57.57%) avions comportant la classe business qui s’adresse aux personnes effectuant des voyages professionnels ce qui est trés normal pour une compagnie qui posséde 28 avions. Ces 2 classes sont les classes les plus reservées par les voyageurs.
#moyenne des sieges de la classe economique
mean(dataTunisair$Seats..Economy.)
## [1] 138.5714
#moyenne des sieges de la classe business
mean(dataTunisair$Seats..Business.)
## [1] 12.28571
View(dataTunisair)
La moyenne du nombre de siéges des avions de classe économique est 138 supérieure à celle de la classe business qui est 12 ce qui est normal puisque la classe economique est la plus prisée des voyageurs, car elle constitue l’offre la moins chère.
eco[which.max(eco$Seats..Economy.),]
business[which.max(business$Seats..Business.),]
Nous remarquons que l’avion Airbus A330-243 posséde le plus grand nombre de siéges dans la classe économique et la classe business nous pouvons dire que c’est le plus grand avion que Tunisair posséde.
mean(dataTunisair$Seat.Width..Business.)
## [1] 14.17143
mean(dataTunisair$Seat.Pitch..Business.)
## [1] 25.07143
dans la classe business : la moyenne de la largeur des sièges est de 14.17. la moyenne de l’espace entre les sièges est de 25.07.
la moyenne de la largeur des sièges de la flotte typique est de 20.73333 la moyenne de l’espace entre les sièges est de 71.01667
mean(dataTunisair$Seat.Width..Economy.)
## [1] 17.53929
mean(dataTunisair$Seat.Pitch..Economy.)
## [1] 29.96429
dans la classe economique : la moyenne de la largeur des sièges est de 17.53. la moyenne de l’espace entre les sièges est de 29.96
-la moyenne de la largeur des sièges d’une flotte typique 17.86667 -la moyenne de l’espace entre les sièges d’une flotte typique est de 31.1
wifi=dataTunisair[which(dataTunisair$wifi>0),]
nrow(wifi)
## [1] 0
dataTunisair[which(dataTunisair$Video>0 & dataTunisair$Satellite>0 ),]
Nous remarquons que tous les avions de Tunisair ne possédent ni wifi ni video.
Nous remarquons également que l’avion Airbus A330-243 est le seul qui posséde des videos et des satellites.
-la flotte typique montre la présence de wifi de video et de satéllite
mean(dataTunisair$Range..miles)
## [1] 6240
La moyenne de la distance que les avions de tunisair peut parcourir est de 6240 .
La moyenne de la distance qu’un avion typique peut parcourir est de 6449.533 .
range=dataTunisair[which.max(dataTunisair$Range..miles.),]
range
Le même avion Airbus A330-243 peut parcourir 7767 miles.
Pour conclure Tunisair répond aux éxigences d’une flotte typique cependant elle doit améliorer quelques points comme le confort (distance entre les sièges) et des services (wifi , video )
nrow(dataTunisair[which(dataTunisair$Engines == 2),])
## [1] 28
Tous les avions de tunisair sont formés de 2 moteurs.
-la flotte typique posséde 2 moteurs .
Relation entre les variables
library("corrplot")
Tuni<-scale(dataTunisair,scale=T,center=T)
corrplot(Tuni, is.corr=FALSE)
Utilisation de l’ACP pour réduire l’information dans un nombre minimal de dimension.
library("FactoMineR")
t=PCA(dataTunisair,quanti.sup=c(18,19,21,22,23,31,33))
D’aprés ce graphique de corrélation des variables, nous pouvons voir clairement, que l’avion Airbus A330-243 v1 Airbus A330-243 v2 sont les meilleurs avions que posséde la compagnie Tunisair.
library("FactoMineR")
library("factoextra")
res.pca <- PCA(dataTunisair, graph = FALSE)
fviz_pca_var(res.pca, col.var = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE
)
Nous pouvons donc conclure que “Airbus A330-243” est caracterisé par la meilleure range miles ,tail height et economy class et le seul avion qui posséde la video et satellite.
Une bonne representation “Cruising.Speed..mph.” qui caractérise le plus les avions Boeing. Seulement les avions “Airbus” ont la classe Business.
Tuni<-scale(dataTunisair,scale=T,center=T)
Tuni[is.nan(Tuni)] <- 0
t<-Tuni[, colSums(Tuni != 0) > 0] #pour elimner les 0 de toute les colonnes
m <- cor(t)
corrplot(m, method = "number") #voir la correlation entres les variables
dataTunisair$Cruising.Speed..mph.
## [1] 598 514 514 514 514 559 598 598 598 598 598 598 514 514 514 514 514
## [18] 514 514 514 514 514 514 514 514 514 514 559
D’aprés la fonction corrplot nous pouvons détérminer la correlation entre les différents variables telque seats with business et seat pitch business et seats business avec la variable business ce qui est trés logique.
Preparation des données
boxplot(dataTunisair)
Nous remarquons qu’il est difficile de comparer nos variables car elles n’ont pas la même unité, donc nous devons passer par le centrage et réduction
Tuni<-scale(dataTunisair,scale=T,center=T)
Tuni[is.nan(Tuni)] <- 0
boxplot(Tuni)
Nous remarquons que la qualité du bocplot s’est ameliorée et les données sont plus lisibles et les variables sont devenues comparables.
Modelisation
head(na.omit(Tuni)) #pour voir s'il y a des données manquantes
## Seat.Width..Club. Seat.Pitch..Club.
## Boeing 737-600 v1 0 0
## Airbus A320-211 v1 0 0
## Airbus A320-214 v1 0 0
## Airbus A319-114 v1 0 0
## Airbus A319-114/--112 ER v1 0 0
## Airbus A330-243 v1 0 0
## Seat..Club. Seat.Width..First.Class.
## Boeing 737-600 v1 0 0
## Airbus A320-211 v1 0 0
## Airbus A320-214 v1 0 0
## Airbus A319-114 v1 0 0
## Airbus A319-114/--112 ER v1 0 0
## Airbus A330-243 v1 0 0
## Seat.Pitch..First.Class. Seats..First.Class.
## Boeing 737-600 v1 0 0
## Airbus A320-211 v1 0 0
## Airbus A320-214 v1 0 0
## Airbus A319-114 v1 0 0
## Airbus A319-114/--112 ER v1 0 0
## Airbus A330-243 v1 0 0
## Seat.Width..Business. Seat.Pitch..Business.
## Boeing 737-600 v1 -1.4009955 -1.3717063
## Airbus A320-211 v1 0.5564438 0.4884994
## Airbus A320-214 v1 0.5564438 0.4884994
## Airbus A319-114 v1 -1.4009955 -1.3717063
## Airbus A319-114/--112 ER v1 0.8727976 1.0356187
## Airbus A330-243 v1 1.2583538 1.4733142
## Seats..Business. Seat.Width..Eco.Comfort.
## Boeing 737-600 v1 -1.18346964 0
## Airbus A320-211 v1 -0.41283825 0
## Airbus A320-214 v1 -0.41283825 0
## Airbus A319-114 v1 -1.18346964 0
## Airbus A319-114/--112 ER v1 -0.02752255 0
## Airbus A330-243 v1 1.12842454 0
## Seat.Pitch..Eco.Comfort. Seats..Eco.Comfort.
## Boeing 737-600 v1 0 0
## Airbus A320-211 v1 0 0
## Airbus A320-214 v1 0 0
## Airbus A319-114 v1 0 0
## Airbus A319-114/--112 ER v1 0 0
## Airbus A330-243 v1 0 0
## Seat.Width..Economy. Seat.Pitch..Economy.
## Boeing 737-600 v1 -1.4312386 -1.21652160
## Airbus A320-211 v1 0.5836895 0.04505636
## Airbus A320-214 v1 0.5836895 0.04505636
## Airbus A319-114 v1 1.4792130 0.04505636
## Airbus A319-114/--112 ER v1 -1.2073577 1.30663431
## Airbus A330-243 v1 0.3598086 2.56821227
## Seats..Economy. Accommodation
## Boeing 737-600 v1 -0.3963208 -0.7782357
## Airbus A320-211 v1 0.3602916 0.1926326
## Airbus A320-214 v1 0.3602916 0.1926326
## Airbus A319-114 v1 0.1711385 -0.2928016
## Airbus A319-114/--112 ER v1 -1.1529331 -1.4254813
## Airbus A330-243 v1 3.2606389 2.9973634
## Cruising.Speed..mph. Range..miles. Engines
## Boeing 737-600 v1 1.6144829 -1.0413121 0
## Airbus A320-211 v1 -0.6538945 -0.1583076 0
## Airbus A320-214 v1 -0.6538945 -0.1583076 0
## Airbus A319-114 v1 -0.6538945 1.0729736 0
## Airbus A319-114/--112 ER v1 -0.6538945 1.0729736 0
## Airbus A330-243 v1 0.5613077 2.6859519 0
## Wingspan..ft. Tail.Height..ft. Length..ft.
## Boeing 737-600 v1 -0.1739350 -0.2723642 -0.8099488
## Airbus A320-211 v1 -0.3079766 -0.2723480 0.0759327
## Airbus A320-214 v1 -0.3079766 -0.2723480 0.0759327
## Airbus A319-114 v1 -0.3079766 -0.2723480 -0.4998902
## Airbus A319-114/--112 ER v1 -0.3079766 -0.2723480 -0.4998902
## Airbus A330-243 v1 3.5345498 3.5405811 3.2651059
## Wifi Video Power Satellite
## Boeing 737-600 v1 0 -0.340168 -0.2723524 -0.2723524
## Airbus A320-211 v1 0 -0.340168 -0.2723524 -0.2723524
## Airbus A320-214 v1 0 -0.340168 -0.2723524 -0.2723524
## Airbus A319-114 v1 0 -0.340168 -0.2723524 -0.2723524
## Airbus A319-114/--112 ER v1 0 2.834734 -0.2723524 -0.2723524
## Airbus A330-243 v1 0 2.834734 3.5405811 3.5405811
## Flat.bed Sleeper Club First.Class
## Boeing 737-600 v1 -0.2723524 0 0 0
## Airbus A320-211 v1 -0.2723524 0 0 0
## Airbus A320-214 v1 -0.2723524 0 0 0
## Airbus A319-114 v1 -0.2723524 0 0 0
## Airbus A319-114/--112 ER v1 -0.2723524 0 0 0
## Airbus A330-243 v1 3.5405811 0 0 0
## Business Eco.Comfort Economy
## Boeing 737-600 v1 -1.4267846 0 0
## Airbus A320-211 v1 0.6758453 0 0
## Airbus A320-214 v1 0.6758453 0 0
## Airbus A319-114 v1 -1.4267846 0 0
## Airbus A319-114/--112 ER v1 0.6758453 0 0
## Airbus A330-243 v1 0.6758453 0 0
wssplot <- function(data, nc=15, seed=1234){
wss <- (nrow(data)-1)*sum(apply(data,2,var))
for (i in 2:nc){
set.seed(seed)
wss[i] <- sum(kmeans(data, centers=i)$withinss)}
plot(1:nc, wss, type="b", xlab="Number of Clusters",
ylab="Within groups sum of squares")}
wssplot (Tuni, nc=10, seed=1234)
D’aprés cette fonction ,le nombre optimal de cluster est 3 ou bien 4.
library(FactoMineR)
for (k in 3:4)
{
km = kmeans(Tuni,k)
gpe.kmeans = km$cluster
datatunisaire=cbind(Tuni,gpe.kmeans)
dataTunClus=PCA(datatunisaire, quali.sup=34,quanti.sup=c(18,19,21,22,23,31,33))
}
Nous remarquons que dans le cas où k=3 nous avons une meilleure ségmentation puisque les groupes sont plus separés.
#choisissons le k=3
set.seed(12)
km = kmeans(Tuni,3)
gpe.kmeans = km$cluster
datatunisaire=cbind(Tuni,gpe.kmeans)
dataTunClus=PCA(datatunisaire, quali.sup=34,quanti.sup=c(18,19,21,22,23,31,33))
library(FactoMineR)
which(colnames(dataTunClus$call$X)=="gpe.kmeans")
## [1] 34
table(km$cluster)
##
## 1 2 3
## 9 17 2
Nous avons obtenu une classe contenant 9 entrées,une 2éme avec 17 entrées et l’autre 2 entrées.
gpe.kmeans
## Boeing 737-600 v1 Airbus A320-211 v1
## 1 2
## Airbus A320-214 v1 Airbus A319-114 v1
## 2 1
## Airbus A319-114/--112 ER v1 Airbus A330-243 v1
## 2 3
## Boeing 737-600 v2 Boeing 737-600 v3
## 1 1
## Boeing 737-600 v4 Boeing 737-600 v5
## 1 1
## Boeing 737-600 v6 Boeing 737-600 v7
## 1 1
## Airbus A320-211 v2 Airbus A320-211 v3
## 2 2
## Airbus A320-211 v4 Airbus A320-211 v5
## 2 2
## Airbus A320-211 v6 Airbus A320-211 v7
## 2 2
## Airbus A320-211 v8 Airbus A320-211 v9
## 2 2
## Airbus A320-214 v2 Airbus A320-214 v3
## 2 2
## Airbus A320-214 v4 Airbus A320-214 v5
## 2 2
## Airbus A320-214 v6 Airbus A319-114 v2
## 2 1
## Airbus A319-114/--112 ER v2 Airbus A330-243 v2
## 2 3
Determination des caractéristiques et analyse de chaque cluster
data_kmean <- cbind(dataTunisair, groupe2mean=km$cluster)
data2mean <- as.data.frame(data_kmean)
aggregate(data2mean,by=list(data2mean$groupe2mean),FUN=mean)
Nous remarquons que le cluster 3 est le meilleur, il est caracterisé par les meilleurs Seat.Pitch..Economy , Seats..Economy,cruising.speed, range.miles , le seul cluster qui comporte video, power, satellite, flat bed, accommodation et le meilleur dans la classe bunisness et economy, donc le cluster 3 represente le meilleur profil d’avion chez Tunisair de point de vue qualité.
Alors que le 1ér cluster est un cluster qui ne contient pas la classe business et le plus faible au niveau de range.miles.
le cluster 2 est le cluster caracterisé par Seat.Width..Economy et Engines Wingspan..ft, le plus faible cluster au niveau de Cruising.Speed..mph.
Chargement du jeu de données
airMaroc = read.table("marocRoyal.csv" ,sep=",",dec=",",header=T)
airMarocEconymy = read.table("marocEconomy.csv",sep=",",dec=",",header=T)
airMarocBusiness = read.table("marrocBusiness.csv",sep=",",dec=",",header=T)
tunisair2 = read.table("tunisair2.csv" ,sep=",",dec=",",header=T)
head(airMarocBusiness)
dim(airMaroc)
## [1] 16 8
dim(tunisair2)
## [1] 8 8
airMaroc[1] <- data.frame(lapply(airMaroc[1], as.character), stringsAsFactors=FALSE)
tunisair2[1] <- data.frame(lapply(tunisair2[1], as.character), stringsAsFactors=FALSE)
Nous remarquons que Tunisair posséde 8 modèles d’avion alors que royal air maroc posséde 16 modèles.
la comparaison va se baser sur la différence entre Tunisair et Royal Air Maroc au niveau du confort (seats widh, seats pitch), services offerts (wifi, video, power)
Convertir Aircraft.with.seatmap de type factor en type characters
Aircrafts <- NULL
#select all the aircraft and cleaning them
for (i in 1:nrow(airMaroc)) {
Aircrafts <- c(Aircrafts, b<-gsub("\\(.*", "", airMaroc$Aircraft.with.seatmap))
}
#Added a colom to the ana_delta with the cleaned up name
for (i in 1:nrow(airMaroc)) {
airMaroc[i,1] <- Aircrafts[i]
}
Aircrafts2 <- NULL
#select all the aircraft and cleaning them
for (i in 1:nrow(tunisair2)) {
Aircrafts2 <- c(Aircrafts2, b<-gsub("\\(.*", "", tunisair2$Aircraft.with.seatmap))
}
#Added a colom to the ana_delta with the cleaned up name
for (i in 1:nrow(tunisair2)) {
tunisair2[i,1] <- Aircrafts2[i]
}
avector <- as.vector(airMaroc['Aircraft.with.seatmap'])
pie(table(avector))
avector2 <- as.vector(tunisair2['Aircraft.with.seatmap'])
pie(table(avector2))
Nous remarquons que la majorité des avions de Tunisair est de type Airbus alors que chez Royal Air Maroc elle est de type Boieng.
Conversion des données
library(plyr)
airMaroc$Video.Type <- revalue(airMaroc$Video.Type, c("On-Demand TV"=1))
airMaroc$Video.Type <- revalue(airMaroc$Video.Type, c("Overhead TV"=1))
airMaroc$Video.Type <- revalue(airMaroc$Video.Type, c("None"=0))
airMaroc$Wi.Fi <- revalue(airMaroc$Wi.Fi, c("No"=0))
airMaroc$Laptop.Power <- revalue(airMaroc$Laptop.Power, c("None"=0))
airMaroc$Laptop.Power <- revalue(airMaroc$Laptop.Power, c("All Seats"=1))
airMaroc$Power.Type <- revalue(airMaroc$Power.Type, c("AC Power"=1))
airMaroc$Power.Type <- revalue(airMaroc$Power.Type, c("None"=0))
tunisair2$Video.Type <- revalue(tunisair2$Video.Type, c("Seatback TV"=1))
tunisair2$Video.Type <- revalue(tunisair2$Video.Type, c("None"=0))
tunisair2$Wi.Fi <- revalue(tunisair2$Wi.Fi, c("No"=0))
tunisair2$Laptop.Power <- revalue(tunisair2$Laptop.Power, c("None"=0))
tunisair2$Laptop.Power <- revalue(tunisair2$Laptop.Power, c("All Seats"=1))
tunisair2$Power.Type <- revalue(tunisair2$Power.Type, c("AC Power"=1))
tunisair2$Power.Type <- revalue(tunisair2$Power.Type, c("None"=0))
Comparons la moyenne de seat pitch chez Tunisair business et royal maroc business
airMarocBusiness$Seat.Pitch <- as.numeric(as.character(airMarocBusiness$Seat.Pitch))
airMarocBusiness$Seat.Pitch <- as.numeric(as.character(airMarocBusiness$Seat.Width))
#moyenne Seat.Pitch maroc
mean(airMarocBusiness$Seat.Pitch)
## [1] 20.5
#moyenne Seat.Widh maroc
mean(airMarocBusiness$Seat.Width)
## [1] 20.5
#moyenne Seat.Pitch tunisair
mean(dataTunisair$Seat.Width..Business.)
## [1] 14.17143
#moyenne Seat.Widh tunisair
mean(dataTunisair$Seat.Pitch..Business.)
## [1] 25.07143
La moyenne de “Seat.Pitch” chez Tunisair est de 14.17 inférieure a celle de Royal Air Maroc qui est 20.5.
La moyenne de “Seat.Widh” est preque la même chez les 2 compagnies dans la classe business.
Comparons maintenant la moyenne de seat widh chez Tunisair economy et Royal Air Maroc economy
airMarocEconymy$Seat.Pitch <- as.numeric(as.character(airMarocEconymy$Seat.Pitch))
airMarocEconymy$Seat.Pitch <- as.numeric(as.character(airMarocEconymy$Seat.Width))
#moyenne Seat.Pitch maroc
mean(airMarocEconymy$Seat.Pitch)
## [1] 17
#moyenne Seat.Widh maroc
mean(airMarocEconymy$Seat.Width)
## [1] 17
#moyenne Seat.Pitch tunisair
mean(dataTunisair$Seat.Width..Economy.)
## [1] 17.53929
#moyenne Seat.Widh tunisair
mean(dataTunisair$Seat.Pitch..Economy.)
## [1] 29.96429
La moyenne “Seat.pitch” est presque la même chez les 2 compagnies dans la classe économique.
La moyenne “Seat.Widh” chez Tunisair est de 29.96 supérieur à celui de Royal Air Maroc qui est 17.
airMaroc$Wi.Fi <- as.numeric(as.character(airMaroc$Wi.Fi))
nrow(airMaroc[which(airMaroc$Wi.Fi>0),])
## [1] 0
Royal Air Maroc ne dispose d’aucun avion avec le wifi. Nous remarquons donc que les 2 compagnies n’ont aucun modéle d’avion qui dispose du wifi.
airMaroc$Power.Type <- as.numeric(as.character(airMaroc$Power.Type))
nrow(airMaroc[which(airMaroc$Power.Type>0),])
## [1] 8
tunisair2$Power.Type <- as.numeric(as.character(tunisair2$Power.Type))
nrow(tunisair2[which(tunisair2$Power.Type>0),])
## [1] 2
Nous remarquons qu’il y a 8 modéles d’avions qui disposent du power type chez Royal Air Maroc alors qu’il y a 2 modéles seulement chez Tunisair.
airMaroc$Video.Type <- as.numeric(as.character(airMaroc$Video.Type))
nrow(airMaroc[which(airMaroc$Video.Type>0),])
## [1] 12
tunisair2$Video.Type <- as.numeric(as.character(tunisair2$Video.Type))
nrow(tunisair2[which(tunisair2$Video.Type>0),])
## [1] 2
La même chose pour la video type .
airMaroc$Laptop.Power <- as.numeric(as.character(airMaroc$Laptop.Power))
nrow(airMaroc[which(airMaroc$Laptop.Power>0),])
## [1] 4
tunisair2$Laptop.Power <- as.numeric(as.character(tunisair2$Laptop.Power))
nrow(tunisair2[which(tunisair2$Laptop.Power>0),])
## [1] 1
Il y a un seul modéle d’avion qui dispose du Laptop.Power chez Tunisair alors qu’on trouve 4 chez Royal Air Maroc.
Nombre d’avion
library(readxl)
ageMaroc <- read_excel("ageFlotteMaroc.xlsx")
ageTunisair <- read_excel("ageFlotteTunisair.xlsx")
sum(ageMaroc$Current)
## [1] 51
sum(ageTunisair$Current)
## [1] 28
Nous remarquons qu’il y a une grande différence de 23 avions entre le nombre d’avions de Tunisair et Royal Air Maroc
Age flotte
mean(ageMaroc$`Avg. Age`)
## [1] 12.54
mean(ageTunisair$`Avg. Age`)
## [1] 13.925
La moyenne d’âge de tunisair est de 13.925 superieure légerement à la moyenne d’âge de Royal Air Maroc qui est 12.54.
Pour conclure nous voyons que Royal air Maroc a un léger avantage par rapport à Tunisair surtout sur le plan du nombre d’avion, Video.Type et le power.
Tunisair est conforme à la la flotte typique dans :
Tunisair est non conforme à la flotte type dans :
-Si Tunisair aimerait viser haut il faut qu’elle dispose d’une first class ajouter des services comme le wifi et la video ,renforcer sa puissance et améliorer le confort (chaises et flat-bed)
Connaître l’emplacement de tunisair par rapport à ses concurrents directs (maroc) nous avons constaté que notre concurrent posséde plus de nombre d’avion (51) et il est plus avantagé en confort dans la classe business mais aussi la moyenne d’âge qui est supérieure aux avions de Royal Air Maroc .
Nous avons pu déterminer la position de Tunisair côté service elle est moyenne à ce niveau et elle est faible en divertissement par rapport à ses concurrents
Nous avons constaté que Tunisair répond aux exigences de la flotte typique avec quelques points à améliorer (comme le confort )
Pour récaputiler et sortir avec des solutions pouvant être envisagées par la compagnie Tunisair . Elle doit acheter de nouvelles flottes de type A330 pour les courtes distances et Boing776 pour les longues distances afin d’atteindre le marché asiatique qui s’est avéré en progression et qui a atteint une amélioration de 190% en 2018 .